package com.charging.business.media;

import com.charging.business.utils.ToolsUtil;

/**
 * 双片式OBU交费信息文件(DF01/EF04)编码信息
 * @author lzj
 */
public class ObuEf04EdModel {
    /**
     * 含全部信息文件长度
     */
    public static final int MSG_LEN1 = 198;

    /**
     * 不含分省信息文件长度
     */
    public static final int MSG_LEN2 = 91;

    /**
     * 用户卡0019文件前39BYTES((到nVSign))(315-353,39,bn)
     */
    public byte[] uc0019 = new byte[39];

    /**
     * 用户卡0015文件前20BYTES(到cardNo)(354-373,20,bn)
     */
    public byte[] uc0015 = new byte[20];

    /**
     * 用户类型(374-374,1,n)
     * 写入0015文件第 41 字节
     */
    public byte[] vehicleUserType = new byte[1];

    /**
     * 全程累计省份数量(375-375,1,n)
     * 根据 OBU返回状态判断后累加写入。入口置 1 出口清 0
     */
    public byte[] provCount = new byte[1];

    /**
     * 全程累计应收金额(376-378,3,n)
     * 全程应收金额累计,单位：分
     */
    public byte[] sumPayFee = new byte[3];

    /**
     * 全程累计实收金额(379-381,3,n)
     * 全程实收金额累计,单位：分
     */
    public byte[] sumFee = new byte[3];

    /**
     * 全程累计成功次数(382-383,2,n)
     * ETC门架系统（含兼具门架功能的收费站入出口）根据 OBU返回状态判断后累加写入
     */
    public byte[] sumOkCount = new byte[2];

    /**
     * 全程累计计费里程(384-386,3,n)
     * 单位米
     */
    public byte[] sumMileage = new byte[3];

    /**
     * 全程累计无卡次数(387-387,1,n)
     */
    public byte[] sumNoCardCount = new byte[1];

    /**
     * 本省入口编码(388-390,3,bn)
     * 入口收费站（写入 3 字节 0x00）或省界入口门架 HEX 码
     */
    public byte[] provEntryHex = new byte[3];

    /**
     * 本省累计应收金额(391-393,3,n)
     * 单位：分
     * ETC 门架系统（含兼具门架功能的收费站入出口）根据 OBU 返回状态判断后累加写入应收金额，进入下一省后重新计数
     */
    public byte[] provSumPayFee = new byte[3];

    /**
     * 本省累计成功次数(394-394,1,n)
     * ETC 门架系统（含兼具门架功能的收费站入出口）根据 OBU 返回状态判断后累加写入，进入下一省后重新计数
     */
    public byte[] provSumCount = new byte[1];

    /**
     * 本省累计实收金额(395-397,3,n)
     * ETC 门架系统（含兼具门架功能的收费站入出口）根据 OBU 返回状态判断后累加写入，进入下一省后重新计数
     */
    public byte[] provSumFee = new byte[3];

    /**
     * 加密摘要(398-405,8,bn)
     * 入出口默认为0x0000000000000000
     */
    public byte[] mark = new byte[8];

    /**
     * 通行省份累计实收金额(406-485,80,bn)
     * 顺序记录，每过一个省增加4个字节，格式为：AABBBBBB-AA为省份的BCD区号;BBBBBB-为改省累计实收金额(如：河南1分:0x41000001),最多记录20个分省信息
     */
    public byte[] provTolls = new byte[80];

    /**
     * 保留(486-512,27,bn)
     */
    public byte[] spare = new byte[27];

    private static ObuEf04EdModel parseSelf(byte[] buff) {
        int index = 0;
        ObuEf04EdModel ret = new ObuEf04EdModel();

        index += ToolsUtil.arrcopy(buff, index, ret.uc0019);
        index += ToolsUtil.arrcopy(buff, index, ret.uc0015);
        index += ToolsUtil.arrcopy(buff, index, ret.vehicleUserType);
        index += ToolsUtil.arrcopy(buff, index, ret.provCount);
        index += ToolsUtil.arrcopy(buff, index, ret.sumPayFee);
        index += ToolsUtil.arrcopy(buff, index, ret.sumFee);
        index += ToolsUtil.arrcopy(buff, index, ret.sumOkCount);
        index += ToolsUtil.arrcopy(buff, index, ret.sumMileage);
        index += ToolsUtil.arrcopy(buff, index, ret.sumNoCardCount);
        index += ToolsUtil.arrcopy(buff, index, ret.provEntryHex);
        index += ToolsUtil.arrcopy(buff, index, ret.provSumPayFee);
        index += ToolsUtil.arrcopy(buff, index, ret.provSumCount);
        index += ToolsUtil.arrcopy(buff, index, ret.provSumFee);
        index += ToolsUtil.arrcopy(buff, index, ret.mark);
        index += ToolsUtil.arrcopy(buff, index, ret.provTolls);
        index += ToolsUtil.arrcopy(buff, index, ret.spare);

        return ret;
    }

	/**
	 * 预解析
	 *
	 * @param strHex
	 * @return
	 */
    public static ObuEf04EdModel parse(String strHex) {
        if (strHex == null || strHex.isEmpty()) {
            return null;
        }
//        if (strHex.length() != DOBUDFEF04ED.MSG_LEN1 * 2 && strHex.length() != DOBUDFEF04ED.MSG_LEN2 * 2) {
//            return null;
//        }
        if (!ToolsUtil.chkHexChar(strHex)) {
            return null;
        }

        byte[] buff = ToolsUtil.hex2bin(strHex);

        return parseSelf(buff);
    }

	/**
	 * 信息解码
	 *
	 * @return
	 */
	public ObuEf04Model decoded() {
        ObuEf04Model dd = new ObuEf04Model();
        dd.uc0019 = Card0019Ed39Model.parse(uc0019).decoded();
        dd.uc0015 = Card0015Ed20Model.parse(uc0015).decoded();
        dd.vehicleUserType = ToolsUtil.bin2int(vehicleUserType);
        dd.provCount = ToolsUtil.bin2int(provCount);
        dd.sumPayFee = ToolsUtil.bin2int(sumPayFee);
        dd.sumFee = ToolsUtil.bin2int(sumFee);
        dd.sumOkCount = ToolsUtil.bin2int(sumOkCount);
        dd.sumMileage = ToolsUtil.bin2int(sumMileage);
        dd.sumNoCardCount = ToolsUtil.bin2int(sumNoCardCount);
        dd.provEntryHex = ToolsUtil.bin2hex(provEntryHex);
        dd.provSumPayFee = ToolsUtil.bin2int(provSumPayFee);
        dd.provSumCount = ToolsUtil.bin2int(provSumCount);
        dd.provSumFee = ToolsUtil.bin2int(provSumFee);
        dd.mark = ToolsUtil.bin2hex(mark);

        int index = 0;
        byte[] temp = new byte[4];
        for (int aa = 0; aa < 20; aa++) {
            index += ToolsUtil.arrcopy(provTolls, index, temp);
            ObuProvEdModel edProToll = ObuProvEdModel.parse(temp);
            dd.provTolls[aa] = edProToll.decoded();
        }

        // 用户类型变换
        // 非新国标用户类型转为普通车
        // 不为普通车,军警车,J1集装箱,应急救援,挂车,J2集装箱
        if (dd.vehicleUserType != 0x00 && dd.vehicleUserType != 0x08 && dd.vehicleUserType != 0x18 && dd.vehicleUserType != 0x1A && dd.vehicleUserType != 0x1B && dd.vehicleUserType != 0x1C) {
            //强制转换为普通车
            dd.vehicleUserType = 0x00;
        }

        return dd;
    }
}
